#pragma rtGlobals=1 // Use modern global access method. //********************************************************************************************* // U−best Reader Vol.2 2004.02.04(牧田行弘) //********************************************************************************************* //特徴: U-bestのPCで作成したtextファイルをwaveに自動変換 // ファイル名に添え字をつけたウェーブを自動作成 // フォルダからファイルを一度に読み込む機能 // Convertを選ぶと読み込んだデータを設定した関数で自動的に変換 // スペクトルの段差を補正するプログラムを内蔵 // // //注意: ■測定したtxtデータは100倍にしておく必要があります。 //  (U-bestの性質上Textに変換すると測定値が粗くなるため、TXTで保存する前に100倍してください) // ■データの変換を行う場合は測定試料・条件に応じて下記の式を必ず設定してください。 // ■フォルダから開く場合、フォルダ内に他のファイルやフォルダをおかないでください。 // ■段差補正プログラムはグラフ上で行います。 // // //********************************************************************************************* macro Ubest_Reader(program) //メインメニューの制御 variable program Prompt program,"U-best Reader メニュー画面",popup,"○ ファイルを開く;○ フォルダ内の全ファイルを開く;● ファイルを開き変換する;● フォルダ内の全ファイルを開き変換する;■ 段差補正プログラム" if(program==1) ReadFileData() endif if(program==2) ReadFolderData() endif if(program==3) ReadFileData__convert() endif if(program==4) ReadFolderData__Convert() endif if(program==5) hosei() endif endmacro //********************************************************************************************* //フォルダ内のファイルすべてを読み込む //********************************************************************************************* Proc ReadFolderData() variable oo variable conv=0 oo=select_folder(conv) end function select_folder(conv2) variable conv2 //変換数式 string flist //ファイルリスト newpath/O mypath //".txt"ファイルのあるフォルダのパス名を保存(シンボリックパスとして) flist=IndexedFile(mypath,-1,".txt") //フォルダ内にあるファイル名リストを取得 if( strlen(flist) == 0 ) //flistが""(空)の時、スキップする printf "キャンセルされました。" return conv2 else edit as "U-best data" //テーブルの作成 PathInfo mypath //シンボリックパスの情報を獲得 select_folder2(flist,S_path,conv2) //ファイルリストとファルダのフルパス名を渡す endif end function select_folder2(flis2,ffpath,conv3) string flis2 //ファイルリスト string ffpath //フォルダのフルパス名 variable conv3 //変換数式 string fna //抽出したファイル名を一時保存 string file_fpath //ファイルのフルパスを一時保存 string str3 //適当な戻り値の保存先 variable var3 //適当な戻り値 //添え字の設定 String xxx = "_x" String yyy = "_y" Variable zzz Prompt xxx,"X軸waveの添え字を入力:" Prompt yyy,"Y軸waveの添え字を入力:" Prompt zzz, "テーブルを作成しますか?(時間がかかることがあります)", popup "Yes;No" DoPrompt "注意:測定データは、値を100倍にしておく必要があります。", xxx, yyy, zzz if (V_Flag) printf "キャンセルされました。" return -1 // User canceled endif variable j=0 //ファイル番号をカウント variable i=0 do fna=stringfromlist(j,flis2) if(strlen(fna) == 0) i=1 else //ファイルのフルパス名を作成 file_fpath=ffpath+fna //ファイルを開いて情報を取得→ウェーブ2つ作成→表に追加 str3=readF(file_fpath,xxx,yyy,zzz,conv3) j=j+1 endif while(i==0) printf "%g個のファイルを開きました。\r",j //開いたファイル数をプリント return j end //********************************************************************************************* //ひとつのファイルを選択して開く //********************************************************************************************* Proc ReadFileData() Variable refNum,var0 variable conv=0 String fileName,str,str2 open/d/r/M="U-bestのファイル(.txt)を開く。" refNum as fileName String fuPath = S_fileName //フルパス名を保存 Printf "次のデータを読み込み \"%s\"\r", fuPath //フルパス名を表示 fileName=getFname(S_fileName) //フルパス名からファイル名を抜き取り printf "ファイル名:\"%s\"\r", fileName //ファイル名を表示 edit as "U-best data" //テーブルの作成 var0=input_xx(fileName,fuPath,conv) //添え字の入力→ファイル読み込みへ。 end function input_xx(fnam,ful_Path,conv2) string fnam string ful_Path variable conv2 //変換数式 string strr // 添え字の設定 String xName2 = "_x" String yName2 = "_y" Variable createTable2 Prompt xName2,"X軸waveの添え字:" Prompt yName2,"Y軸waveの添え字:" Prompt createTable2, "tableの作成", popup "Yes;No" DoPrompt "注意:測定データは、値を100倍にしておく必要があります。", xName2, yName2, createTable2 if (V_Flag) printf "キャンセルされました。" return -1 // User canceled endif //ファイル内容をよみとる。 strr=readF(ful_Path,xName2,yName2,createTable2,conv2) end //********************************************************************************************* //フォルダ内のファイルすべてを読み込み、吸収係数等に変換する //********************************************************************************************* Proc ReadFolderData__Convert() variable conv=1 variable oo oo=select_folder(conv) end //********************************************************************************************* //ひとつのファイルを選択して開き、吸収係数等に変換する //********************************************************************************************* Proc ReadFileData__convert() variable conv=1 Variable refNum,var0 String fileName,str,str2 open/d/r/M="U-bestのファイル(.txt)を開く。" refNum as fileName String fuPath = S_fileName //フルパス名を保存 Printf "次のデータを読み込み \"%s\"\r", fuPath //フルパス名を表示 fileName=getFname(S_fileName) //フルパス名からファイル名を抜き取り printf "ファイル名:\"%s\"\r", fileName //ファイル名を表示 edit as "Tabl" //テーブルの作成 var0=input_xx(fileName,fuPath,conv) //添え字の入力→ファイル読み込みへ。 end //*********************************************** //フルパスからファイル内容を読み取り function/S readF(fpath,xst,yst,crtTable,conv4) variable conv4 //変換数式 String fpath //フルパス名 string xst //xデータ、ウェーブ名につける添え字 string yst //yデータ、ウェーブ名につける添え字 variable crtTable //テーブル作成を行うか(yes,no) Variable refNum String fileName,str open/r refNum as fpath //現在の位置取得、ファイルのバイト合計数取得 FStatus refNum //拡張子前のファイル名取得 string ffname ffname=removef(S_fileName) //拡張子除去 //printf "%s",ffname //行数の読み取り variable i0=1 do FreadLine refNum,str FStatus refNum i0=i0+1 while(V_logEOF!=V_filePos) i0=i0-1 //調整 //print i0 FSetPos refNum, 0 FStatus refNum //行数=i0 //ポイント数i0、ウエーブ名(ファイル名+"_a"or"_c")のウェーブを作成 //ファイル名+"_a"or"_c"のウエーブを作成する string sa,sc sa=ffname+xst //xウェーブの名称 sc=ffname+yst //yウェーブの名称 make/D/O/N=(i0) $sa,$sc //テーブルに列を追加する場合 if(crtTable==1) AppendToTable $sa,$sc endif //1行づづ読み取り、str→数値変換後、ウェーブに代入 Variable ii=1 do FreadLine refNum,str //一行読み取り work1(ii,str,ffname,xst,yst,conv4)//行データより、データの分割作業&読み込み FStatus refNum//ファイルステータスの取得 ii=ii+1 while(V_logEOF!=V_filePos) //実験条件の記述がある場合にこれの除去を行う variable fnd string head open/r refNum as fpath FreadLine refNum,head fnd=strsearch(head,"File name",0) //記述があるか確認 if(fnd==-1) deletepoints 0,2, $sa,$sc variable i000=i0-3 deletepoints i000,1, $sa,$sc printf "ポイント数:%g\r",i000 else deletepoints 0,26, $sa,$sc variable i00=i0-27 deletepoints i00,1, $sa,$sc printf "ポイント数:%g\r",i00 endif //変換数式の代入 if(conv4==1) WaveStats $sc //yの各種値を求める wave w1=$sa wave w2=$sc //■■■■■■■測定試料・条件に応じて以下の式を必ず設定してください。■■■■■■■■ // ■■ w1=1240/w1 //x値 ■■ w2=(-ln(w2)+ln(V_max))/1 //y値 ■■ // ■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //V_npnts ポイント数 V_numNans NaNの数 V_numINFs:INFの数 ■■ //V_avg Y値の平均 V_sdev Y値の標準偏差 V_rms Y値のRMS ■■ //V_adev 平均偏差 V_skew 歪度 V_kurt 尖度 ■■ //V_minloc最小Y値のX位置 V_min 最小Y値 V_maxloc 最大Y値のX位置 ■■ //V_max 最大Y値 ■■ //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ printf "値の変換を行いました。" endif close refNum return ffname end //**************************************************************************** function/S work1(pt,st,fname,xs,ys,conv5)//データの取得 variable pt //ポイント番号 String st //行データ String fname //ファイル名 string xs //xの添え字 string ys //yの添え字 variable conv5 String sa,sb,sc //1列目、2列目、3列目の文字データ Variable da,db,dc //1列目、2列目、3列目の数値データ Variable na,nb,nc //行データより、「nm」「%T」を探してデータを取得 na=2 nb=strsearch(st,"n",na) sa=st[1,nb-2] //nc=strsearch(st,"%",nb) sb=st[nb+3,nb+9] //数値データに変換 na=str2num(sa) nb=str2num(sb) //値を100で割る。 nb=nb*0.01 //ウェーブ名を作製 string wa,wb wa=fname+xs wb=fname+ys //ウェーブに代入 wave w1=$wa wave w2=$wb w1[pt-1]=na w2[pt-1]=nb end //********************************************************************** //ファイル名から拡張子を除く function/S removef(str) string str Variable na,nb na=0 nb=strsearch(str,".",na) return str[0,nb-1] end //*************************************************************************** //フルパスからファイル名(拡張子付き)のみを抽出 function/S getFname(fullPath) string fullPath variable tempNa,NN,tempNN,tempNb,outName NN=0 tempNN=0 do tempNb=tempNa tempNa=strsearch(fullPath,":",NN+1) NN=tempNa tempNN=tempNN+1 //print tempNa,tempNN while (tempNa>0) //print tempNb return fullPath[tempNb+1,strlen(fullPath)] end //******************************段差補正プログラム****************************** proc hosei() //段差補正プログラムメニュー if (WinType("") != 1) DoAlert 0,"段差補正したいwaveをグラフで表示してください。" printf "キャンセルされました。" return endif Button a, size={210, 30}, title="補正(段差位置にカーソルを置いてください)",proc = run Button b, size={50, 30}, title="終了",proc = hoseiEnd ShowInfo end function run(ctrName): ButtonControl String ctrName Variable value=1.00 Prompt value, "適当な補正値を入力してください。" DoPrompt "段差補正プログラム", value if (V_Flag) return -1 // User canceled endif print value Variable/D xa, xb, ya, yb //カーソルの情報を取得 if (pcsr(A)